/*
 * Cr�� le 21 mars 06
 */
package fr.cdesire.sudoku.elements;

import java.util.ArrayList;
import java.util.Collections;

/**
 * Repr�sente une case de grille Sudoku.
 * @author Cedric
 */
public class Case implements Comparable {
	
	private int posLigne;				//Ligne Sudoku sur laquelle se positionne la case
	private int posColonne; 			//Colonne Sudoku sur laquelle se positionne la case
	private int valeur;					//Valeur de la case
	private ArrayList valeursPossibles; //Valeurs possibles pour la case
	
	/**
	 * Constructeur d'une case.
	 * @param posLigne Ligne Sudoku sur laquelle se positionne la case.
	 * @param posColonne Position de la case sur la colonne Sudoku.
	 * @param valeur Valeur de la case.
	 * @param ligne Valeurs de la ligne de la case.
	 * @param colonne Valeurs de la colonne de la case.
	 * @param region Valeurs de la region de la case.
	 */
	public Case(int posLigne, int posColonne, int valeur, 
				ArrayList ligne, ArrayList colonne, ArrayList region) {
		
		this.posLigne = posLigne;
		this.posColonne = posColonne;
		this.valeur = valeur;
		this.valeursPossibles = new ArrayList();
		
		// Recherche des possibilit�s et alimentation du tableau 
		// correspondant
		if (!this.isVide()) return;
		
		Collections.sort(ligne);
		Collections.sort(colonne);
		Collections.sort(region);
		
		for (int i=1; i<=Sudoku.NB_CASES_LIGNE_GRILLE; i++) {
			if ((Collections.binarySearch(ligne, new Integer(i)) < 0) && 
				(Collections.binarySearch(colonne, new Integer(i)) < 0) && 
				(Collections.binarySearch(region, new Integer(i)) < 0)) this.valeursPossibles.add(new Integer(i));
		}
	}
	
	/**
	 * Teste si la case est vide.
	 * @return True si case vide, False sinon. 
	 */
	public boolean isVide() {
		return (this.valeur == 0);
	}
	
	/**
	 * @return Valeur de la case.
	 */
	public int getValeur() {
		return this.valeur;
	}
	
	/**
	 * @return Position de la case sur la ligne Sudoku.
	 */
	public int getPosLigne() {
		return this.posLigne;
	}
	
	/**
	 * @return Position de la case sur la colonne Sudoku.
	 */
	public int getPosColonne() {
		return this.posColonne;
	}
	
	/**
	 * @return Valeurs possibles pour la case.
	 */
	public ArrayList getPossibilites() {
		return this.valeursPossibles;
	}
	
	/**
	 * Red�finit l'�galit� d'une case : m�me valeur 
	 * et m�mes coordonn�es.
	 */
	public boolean equals(Object o) {
		
		if(!(o instanceof Case)) throw new ClassCastException();
		
		if (this.valeur == ((Case)o).getValeur()) {
			if (this.posLigne == ((Case)o).getPosLigne()) {
				if (this.posColonne == ((Case)o).getPosColonne()) return true;
			}
		}
		return false;
	}
	
	/**
	 * D�finit la m�thode compareTo() impl�ment�e par l'interface 
	 * Comparable. Permet de trier les cases dans l'odre du nombre de
	 * possibilit�s.
	 */
	public int compareTo(Object o){
		
		if(!(o instanceof Case)) throw new ClassCastException();
		return (new Integer(this.valeursPossibles.size())).compareTo(new Integer(((Case)o).valeursPossibles.size()));
	}
}